package br.com.hbt.collections;

import java.util.LinkedHashMap;
import java.util.NavigableMap;
import java.util.NavigableSet;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.TreeSet;

/**
 * 1 - Ordered (Ordenado)
 * 2 - UnOrdered(Não Ordenado)
 * 
 * 3 - Sorted (Classificada)
 * 4 - UnSorted (Não-Classificada)
 * 
 * Ordered é o fato de manter na ordem que foi inserido.
 * Sorted é o fato de alterar para ordem conforme um critério de ordenção, por exemplo ordem alfabetica.
 * 
 * @author Herbert Silva
 * @since 21/05/2014
 * @version $Id$
 */
public class Colecoes {

    //ArrayList = Ordered(Ordenado), UnSorted (Não-Classificada)
    //Vector = Ordered(Ordenado), UnSorted (Não-Classificada) - THREAD-SAFE
    //LinkedList = Ordered(Ordenado), UnSorted (Não-Classificada)

    //HashSet = UnOrdered(Não Ordenado), UnSorted (Não-Classificada)
    //LinkedHashSet = Ordered(Ordenado{Inserção ou ultimo item acessado}), UnSorted (Não-Classificada) 
    //TreeSet = Ordered(Ordenado), Sorted(Classificada{Ordem natural ou personalizada}) 

    //Collections - Classe Utilitária para coleções
    //Arrays - Classe Utilitária para Arrays

    //HashMap = UnOrdered(Não Ordenado), UnSorted (Não-Classificada)
    //LinkedHashMap = Ordered(Ordenado), UnSorted (Não-Classificada)
    //TreeMap = Ordered(Ordenado), Sorted(Classificada{Ordem natural ou personalizada})

    //Hashtable = UnOrdered(Não Ordenado), UnSorted (Não-Classificada) - THREAD-SAFE
    public static void main(String[] args) {

        LinkedHashMap<String, String> lhm = new LinkedHashMap<String, String>();
        lhm.put("Marco", "1");
        lhm.put("Herbert", "2");
        lhm.put("Phelipe", "3");
        lhm.put("Cristiano", "4");
        lhm.put("Ana", "5");

        //        System.out.println(lhm.get("Herbert"));
        //
        //        System.out.println(lhm);
        //        testeTreeSet();
        testeTreeMap();

        //        navigableMapStringTest();
    }

    private static void navigableMapStringTest() {
        NavigableMap<String, Integer> navmp = new TreeMap<String, Integer>();
        navmp.put("one", 1);
        navmp.put("two", 2);
        navmp.put("three", 3);
        navmp.put("four", 4);
        navmp.put("five", 5);
        navmp.put("six", 6);

        System.out.println(navmp);

        String[] ob = new String[] {
            navmp.lowerKey("five"),
            navmp.higherKey("five"),
            navmp.ceilingKey("five"),
            navmp.floorKey("five"),
        };

        for (String element : ob) {
            System.out.println(element + ",");
        }
    }

    private static void testeTreeMap() {
        TreeMap<String, String> map = new TreeMap<String, String>();
        map.put("h", "horse");
        map.put("a", "ant");
        map.put("d", "dog");

        SortedMap<String, String> subMap;
        subMap = map.subMap("b", "g");

        System.out.println(map + " - " + subMap);

        map.put("b", "bat");
        subMap.put("f", "fish");

        map.put("r", "raccoon");
        //        subMap.put("p", "pig");
        System.out.println(map + " - " + subMap);
        ((NavigableMap) subMap).pollFirstEntry();

        System.out.println(map + " - " + subMap);

    }

    public static void testeTreeSet() {
        TreeSet<Integer> times = new TreeSet<Integer>();
        times.add(1205);
        times.add(1505);
        times.add(1545);
        times.add(1600);
        times.add(1830);
        times.add(2010);
        times.add(2100);

        System.out.println("LOWER: " + times.lower(1600));
        System.out.println("HIGHER: " + times.higher(2100));
        System.out.println("FLOOR: " + times.floor(1600));
        System.out.println("CEILING: " + times.ceiling(2100));
        System.out.println(" ");
        for (Integer integer : times) {
            System.out.print(integer + "|");
        }
        System.out.println(" ");
        System.out.println("POOLING FIRST: " + times.pollFirst());
        System.out.println(" ");
        for (Integer integer : times) {
            System.out.print(integer + "|");
        }
        System.out.println(" ");
        System.out.println("POOLING LAST: " + times.pollLast());
        System.out.println(" ");
        for (Integer integer : times) {
            System.out.print(integer + "|");
        }
        System.out.println(" ");
        NavigableSet<Integer> ns = times.descendingSet();
        System.out.println(" ");
        for (Integer integer : ns) {
            System.out.print(integer + "|");

        }
    }
}
